package com.java.servlet.web.usuarios.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.java.servlet.web.commons.CatalogoComunVo;
import com.java.servlet.web.commons.GenericDao;
import com.java.servlet.web.conexion.PoolConnection;
import com.java.servlet.web.usuarios.dao.sql.SqlUsuarios;
import com.java.servlet.web.usuarios.vo.UsuariosVo;

public class UsuariosDaoImpl extends GenericDao implements UsuariosDao {
	private static final Logger log = Logger.getLogger(UsuariosDaoImpl.class);
	private Connection conn = null;

	public UsuariosDaoImpl() {
		conn = PoolConnection.getInstance().getConection();
	}
	@Override
	public List<UsuariosVo> getListaUsuarios(UsuariosVo usuariosVo) {
		int index = 1;
		PreparedStatement stm = null;
		ResultSet rs = null;
		List<UsuariosVo> listaUsuarios = null;
		try {
			if (usuariosVo.getIdUsuario() != 0) {
				stm = conn.prepareStatement(SqlUsuarios.DATOS_USUARIOS + SqlUsuarios.DATOS_USUARIOS_IDUSUARIO);
				stm.setInt(index++, usuariosVo.getIdUsuario());
				log.info("LISTA_USUARIOS  [ " + SqlUsuarios.DATOS_USUARIOS + SqlUsuarios.DATOS_USUARIOS_IDUSUARIO);
			} else{
				stm = conn.prepareStatement(SqlUsuarios.DATOS_USUARIOS);
				log.info("LISTA_USUARIOS  [ " + SqlUsuarios.DATOS_USUARIOS);				
			}
			rs = stm.executeQuery();
			listaUsuarios = getListaUsuariosResultSet(rs);
		} catch (SQLException ex) {
			log.error("getListaUsuarios  [ " + ex);
			PoolConnection.getInstance().closeConnection(conn);
		} finally {
			 try {
	                rs.close();
	                stm.close();
	            } catch (SQLException e) {
	            	log.error("SQLException  [ " + e);
	            } 
		}
		return listaUsuarios;
	}
	private List<UsuariosVo> getListaUsuariosResultSet(ResultSet rs) {
		List<UsuariosVo> listaUsuarios = null;
		try{
			if(rs.next()){
				listaUsuarios = new ArrayList<UsuariosVo>();
				do{
					UsuariosVo usuariosVo = new UsuariosVo();
					usuariosVo.setIdUsuario(rs.getInt("ID_USUARIO"));
					usuariosVo.setAliasUsuario(rs.getString("ALIAS_USUARIO"));
					usuariosVo.setClaveUsuario(rs.getString("CLAVE_USUARIO"));
					usuariosVo.setNomUsuario(rs.getString("NOM_USUARIO"));
					usuariosVo.setPatUsuario(rs.getString("PAT_USUARIO"));
					usuariosVo.setMatUsuario(rs.getString("MAT_USUARIO"));
					usuariosVo.setSexoUsuario(rs.getInt("SEXO_USUARIO"));
					usuariosVo.setDescSexo(rs.getString("DESC_SEXO"));
					usuariosVo.setIdRol(rs.getInt("ROL_USUARIO"));
					usuariosVo.setDescRol(rs.getString("DESC_ROL"));
					usuariosVo.setIdVigencia(rs.getString("VIGENCIA"));
					usuariosVo.setDescVigencia(rs.getString("DESC_VIGENCIA"));

					listaUsuarios.add(usuariosVo);
				}while(rs.next());
			}
		}catch(SQLException ex){
			log.error("getListaUsuariosResultSet   [  " + ex);
		}
		return listaUsuarios;
	}
	@Override
	public List<CatalogoComunVo> getCatSexo() {
		PreparedStatement stm = null;
		ResultSet rs = null;
		List<CatalogoComunVo> listaSexo = null;
		try {
				stm = conn.prepareStatement(SqlUsuarios.CAT_SEXO);
				log.info("LISTA_SEXO  [ " + SqlUsuarios.CAT_SEXO);				
			rs = stm.executeQuery();
			listaSexo = getCatComunResultSet(rs);
		} catch (SQLException ex) {
			log.error("getCatSexo  [ " + ex);
			PoolConnection.getInstance().closeConnection(conn);
		} finally {
			 try {
	                rs.close();
	                stm.close();
	            } catch (SQLException e) {
	            	log.error("SQLException  [ " + e);
	            } 
		}
		return listaSexo;
	}
	@Override
	public List<CatalogoComunVo> getCatRoles() {
		PreparedStatement stm = null;
		ResultSet rs = null;
		List<CatalogoComunVo> listaRoles = null;
		try {
				stm = conn.prepareStatement(SqlUsuarios.CAT_ROLES);
				log.info("LISTA_ROLES  [ " + SqlUsuarios.CAT_ROLES);				
			rs = stm.executeQuery();
			listaRoles = getCatComunResultSet(rs);
		} catch (SQLException ex) {
			log.error("getCatSexo  [ " + ex);
			PoolConnection.getInstance().closeConnection(conn);
		} finally {
			 try {
	                rs.close();
	                stm.close();
	            } catch (SQLException e) {
	            	log.error("SQLException  [ " + e);
	            } 
		}
		return listaRoles;
	}
	private List<CatalogoComunVo> getCatComunResultSet(ResultSet rs) {
		List<CatalogoComunVo> listaComun = null;
		try{
			if(rs.next()){
				listaComun = new ArrayList<CatalogoComunVo>();
				do{
					CatalogoComunVo comunVo = new CatalogoComunVo();
					comunVo.setIdValor(rs.getInt("ID"));
					comunVo.setDescValor(rs.getString("DESCR"));

					listaComun.add(comunVo);
				}while(rs.next());
			}
		}catch(SQLException ex){
			log.error("getCatComunResultSet   [  " + ex);
		}
		return listaComun;
	}
	
	public int consecutivoUsuario(){
		int consecutivo = 0;
        PreparedStatement stm = null;
        ResultSet rs = null;
         
        try {
            stm = conn.prepareStatement(SqlUsuarios.MAX_ID_USUARIO);
            log.info("MAX_ID_USUARIO  [ " + SqlUsuarios.MAX_ID_USUARIO);
            rs = stm.executeQuery();
            if(rs.next()) {
            	consecutivo = rs.getInt(1);
            }
        } catch (SQLException ex) {
            log.error("Error en consecutivoUsuario [ ", ex);
        } finally {
			 try {
	                rs.close();
	                stm.close();
	            } catch (SQLException e) {
	            	log.error("SQLException  [ " + e);
	            } 
        }
        return consecutivo;
	}
	@Override
	public void guardarEditUsuario(UsuariosVo usuariosVo) {
		int index = 1;
		PreparedStatement stm = null;
		try {
			stm = conn.prepareStatement(SqlUsuarios.SAVE_EDIT_USUARIO);
			stm.setString(index++, usuariosVo.getAliasUsuario());
			stm.setString(index++, usuariosVo.getClaveUsuario());
			stm.setString(index++, usuariosVo.getNomUsuario());
			stm.setString(index++, usuariosVo.getPatUsuario());
			stm.setString(index++, usuariosVo.getMatUsuario());
			stm.setInt(index++, usuariosVo.getSexoUsuario());
			stm.setInt(index++, usuariosVo.getIdRol());
			stm.setString(index++, usuariosVo.getIdVigencia());
			stm.setInt(index++, usuariosVo.getIdUsuario());
			log.info("SAVE_EDIT_USUARIO  [ " + SqlUsuarios.SAVE_EDIT_USUARIO);
			stm.executeUpdate();
		} catch(SQLException ex){
			log.error("Error al guardarEditUsuario el rol [ " + ex);
		} finally {
			 try {
	                stm.close();
	            } catch (SQLException e) {
	            	log.error("SQLException  [ " + e);
	            } 
        }
	}
	@Override
	public void guardarNuevoUsuario(UsuariosVo usuariosVo) {
		int index = 1;
		PreparedStatement stm = null;
		try {
			stm = conn.prepareStatement(SqlUsuarios.SAVE_NUEVO_USUARIO);
			stm.setInt(index++, consecutivoUsuario());
			stm.setString(index++, usuariosVo.getAliasUsuario());
			stm.setString(index++, usuariosVo.getClaveUsuario());
			stm.setString(index++, usuariosVo.getNomUsuario());
			stm.setString(index++, usuariosVo.getPatUsuario());
			stm.setString(index++, usuariosVo.getMatUsuario());
			stm.setInt(index++, usuariosVo.getSexoUsuario());
			stm.setInt(index++, usuariosVo.getIdRol());
			stm.setString(index++, usuariosVo.getIdVigencia());
			log.info("SAVE_NUEVO_USUARIO  [ " + SqlUsuarios.SAVE_NUEVO_USUARIO);
			stm.executeUpdate();
		} catch(SQLException ex){
			log.error("Error al guardarNuevoUsuario el rol [ " + ex);
		} finally {
			 try {
	                stm.close();
	            } catch (SQLException e) {
	            	log.error("SQLException  [ " + e);
	            } 
        }
	}
	@Override
	public void borrarUsuario(UsuariosVo usuariosVo) {
		int index = 1;
		PreparedStatement stm = null;
		try {
			stm = conn.prepareStatement(SqlUsuarios.DELETE_USUARIO);
			stm.setInt(index++, usuariosVo.getIdUsuario());
			log.info("DELETE_USUARIO  [ " + SqlUsuarios.DELETE_USUARIO);
			stm.executeUpdate();
		} catch(SQLException ex){
			log.error("Error al borrarUsuario el rol [ " + ex);
		} finally {
			 try {
	                stm.close();
	            } catch (SQLException e) {
	            	log.error("SQLException  [ " + e);
	            } 
        }
	}
	@Override
	public UsuariosVo getUsuario(UsuariosVo usuariosVo) {
		int index = 1;
		PreparedStatement stm = null;
		ResultSet rs = null;
		UsuariosVo usuarioVo = null;
		try {
				stm = conn.prepareStatement(SqlUsuarios.DATOS_USUARIOS + SqlUsuarios.DATOS_USUARIOS_IDUSUARIO);
				stm.setInt(index++, usuariosVo.getIdUsuario());
				log.info("USUARIO  [ " + SqlUsuarios.DATOS_USUARIOS + SqlUsuarios.DATOS_USUARIOS_IDUSUARIO);
			rs = stm.executeQuery();
			usuarioVo = getUsuarioResultSet(rs);
		} catch (SQLException ex) {
			log.error("getUsuario  [ " + ex);
			PoolConnection.getInstance().closeConnection(conn);
		} finally {
			 try {
	                rs.close();
	                stm.close();
	            } catch (SQLException e) {
	            	log.error("SQLException  [ " + e);
	            } 
		}
		return usuarioVo;
	}
	private UsuariosVo getUsuarioResultSet(ResultSet rs) {
		UsuariosVo usuarioVo = null;
		try{
			if(rs.next()){
				do{
					usuarioVo = new UsuariosVo();
					usuarioVo.setIdUsuario(rs.getInt("ID_USUARIO"));
					usuarioVo.setAliasUsuario(rs.getString("ALIAS_USUARIO"));
					usuarioVo.setClaveUsuario(rs.getString("CLAVE_USUARIO"));
					usuarioVo.setNomUsuario(rs.getString("NOM_USUARIO"));
					usuarioVo.setPatUsuario(rs.getString("PAT_USUARIO"));
					usuarioVo.setMatUsuario(rs.getString("MAT_USUARIO"));
					usuarioVo.setSexoUsuario(rs.getInt("SEXO_USUARIO"));
					usuarioVo.setDescSexo(rs.getString("DESC_SEXO"));
					usuarioVo.setIdRol(rs.getInt("ROL_USUARIO"));
					usuarioVo.setDescRol(rs.getString("DESC_ROL"));
					usuarioVo.setIdVigencia(rs.getString("VIGENCIA"));
					usuarioVo.setDescVigencia(rs.getString("DESC_VIGENCIA"));

				}while(rs.next());
			}
		}catch(SQLException ex){
			log.error("getRoleResultSet   [  " + ex);
		}
		return usuarioVo;
	}

}
